#include "PropMatrix.h"

CPropItem::CPropItem(){};
CPropItem::~CPropItem()
{
	ClearAll();
};

void CPropItem::ClearAll()
{
	for (itPropValue it=m_values.begin(); it!=m_values.end(); ++it)
	{
		SafeDelete(*it);
	}
	m_values.clear();
};

//////////////////////////////////////////////////////////////////////////
// int prop item
class CIntPropItem: public CPropItem
{
public:
	virtual UUTBool InitOptionsWithString(const UUTTString& str)
	{//a list of integer here ';'
		size_t lastPos = 0;
		size_t pos = str.find_first_of(UUTL(';'));
		while (UUTTrue)
		{
			UUTTString sub;
			if (pos != UUTTString::npos)
			{
				sub = str.substr(lastPos, pos-lastPos);
			}else{
				sub = str.substr(lastPos);
			}
			lastPos = pos+1;
			
			UUTInt32 value = _ttoi(sub.c_str());
			UUTPropValue* ppv = new UUTPropValue;
			ppv->_type = UUTPT_INT;
			ppv->_intValue = value;
			m_values.push_back(ppv);
		
			if (pos == UUTTString::npos) break;

			pos = str.find_first_of(UUTL(';'), pos+1);
		}

		return UUTTrue;
	};
};

//////////////////////////////////////////////////////////////////////////
// bool prop item
class CBoolPropItem: public CPropItem
{
public:
	virtual UUTBool InitOptionsWithString(const UUTTString& str)
	{ //TRUE, FALSE two values
		{
			UUTPropValue* ppvTrue = new UUTPropValue;
			ppvTrue->_type = UUTPT_BOOL;
			ppvTrue->_bValue = UUTTrue;
			m_values.push_back(ppvTrue);
		}
		{
			UUTPropValue* ppvFalse = new UUTPropValue;
			ppvFalse->_type = UUTPT_BOOL;
			ppvFalse->_bValue = UUTFalse;
			m_values.push_back(ppvFalse);
		}

		return UUTTrue;
	};
};

//////////////////////////////////////////////////////////////////////////
// string prop item
class CStringPropItem: public CPropItem
{
public:
	virtual UUTBool InitOptionsWithString(const UUTTString& str)
	{ // generate some sample string here
		{
			UUTPropValue* ppv = new UUTPropValue;
			ppv->_type = UUTPT_STRING;
			static UUTTString tmp1 = UUTL("http://www.cisco.com");
			ppv->_strValue = &tmp1;
			m_values.push_back(ppv);
		}
		{
			UUTPropValue* ppv = new UUTPropValue;
			ppv->_type = UUTPT_STRING;
			static UUTTString tmp1 = UUTL("http://www.webex.com");
			ppv->_strValue = &tmp1;
			m_values.push_back(ppv);
		}

		return UUTTrue;
	}
};

//////////////////////////////////////////////////////////////////////////
//
/*static*/ CPropItem* CPropItemBuilder::MakeItem(
		const UUTTString& id, const UUTTString& type,const UUTTString& str)
{
	CPropItem* pRet = NULL;

	if (type == UUTL("int")){
		pRet = new CIntPropItem;
	}else if (type == UUTL("bool")){
		pRet = new CBoolPropItem;
	}else if (type == UUTL("string")){
		pRet = new CStringPropItem;
	}

	if (pRet)
	{
		pRet->SetID(id);
		if (pRet->InitOptionsWithString(str))
		{
			return pRet;
		}else{
			SafeDelete(pRet);
			return NULL;
		};
	}
	return NULL;
};
